<?php

require_once dirname(__FILE__).'/../lib/citaadminGeneratorConfiguration.class.php';
require_once dirname(__FILE__).'/../lib/citaadminGeneratorHelper.class.php';

/**
 * citaadmin actions.
 *
 * @package    toyomotor
 * @subpackage citaadmin
 * @author     Ing. Roberto Hernandez De La Luz At Netosfera
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class citaadminActions extends autoCitaadminActions
{
 
    /**
     * Metodo que Verifica si una cita ya ha sido tomada o no, si ya fue tomada no hace nada
     * y muestra un mensaje informando de ello, sin embargo si no esta tomada muestra el formulario
     * para mostrarle la informacion al asesor y configura el formulario con los datos por defecto
     * Autor: Ing. Roberto Hernández De La Luz
     * @param sfWebRequest $request 
     */
    public function executeListTomarc(sfWebRequest $request){

        $cita = $this->getRoute()->getObject();
        $this->form = new CitaForm($cita);
        $this->idcita =  $cita->getIdCita();

        if($cita->getVendedor()->getNombre() != null || $cita->getVendedor()->getNombre() != ''){
            
            $this->getUser()->setFlash('notice', 'Esta cita ya tiene un asesor asignado actualmente.');
            $this->redirect('@cita');

        }else{

            $this->hp = $cita->getHoraPreferida();
            $this->ou = $cita->getDetallesUsuario();
            $this->c = $this->getRoute()->getObject();
            $this->form->revisioncitaenvio($this->c->getFecha());
            $this->user = $cita->getUsuario();
            $this->vehiculo = $cita->getVehiculoUsuario();
            $this->servicios = $cita->getServicios();
            
        }


    }
    
    /**
     * Metodo que recibe el id de la cita y recupera toda la informacion referente a ella
     * es decir el vendedor, el cliente, los servicios para mostrarlos
     * Autor: Ing. Roberto Hernández De La Luz
     * @param sfWebRequest $request 
     */
    
        public function executeListConsultarc(sfWebRequest $request){
            
            //Se recupera la cita que es y se recupera toda la informacion relevante
            $this->cita = $this->getRoute()->getObject();
            
            //Se obtienen los servicios para dicha cita
            $this->servicios = $this->cita->getServicios();
            
            //Se obtiene el vendedor
            $this->vendedor = $this->cita->getVendedor();
            
            //Se obtiene el cliente
            $this->cliente = $this->cita->getUsuario();
            
            //Se obtiene el vehiculo
            $this->vehiculo = $this->cita->getVehiculoUsuario();

    }
    
    /**
     * Metodo que se utilizara para enviar un email de encuesta a un usuario que no este en el sistema
     * para ello se pedira el email del usuario y su nombre.
     * Autor: Ing. Roberto Hernández De La Luz
     * @param sfWebRequest $request 
     */
    
        public function executeEnviarencuestaotro(sfWebRequest $request){
            

    }  
    
    /**
     * Metodo que enviara el correo al usuario
     * Autor: Ing. Roberto Hernández De La Luz
     * @param sfWebRequest $request 
     */
    
        public function executeEnviarlinkencuesta(sfWebRequest $request){
            
            $mensaje = 'Hola '.$request->getParameter('nombre').', 
                esta recibiendo este email por que realizo un servicio a su auto con nosotros.<br/> <br/>
                La finalidad del presente correo es invitarlo a que conteste una encuesta de satisfaccion del cliente,
                la cual no llevara mas de 1 minuto y nos ayudara continuar mejorando nuestros servicios.<br/><br/>
                El link para poder contestar la encuesta se encuentra a continuacion:<br/><br/>
                <a href="http://www.toyomotor.com/citas/encuesta/a/s">Contestar Encuesta</a>
                <br/><br/>AUTOMOTRIZ TOYOMOTOR,C.A. RIF: J-29790037-3';
            
            $titulo = 'Encuesta de Servicio';
            $de = 'ToyoMotor';
            $to = $request->getParameter('email');

            // send an email to the affiliate
            $transport = Swift_SmtpTransport::newInstance('ssl://smtp.gmail.com', 465)
            ->setUsername('toyomotorenvios@gmail.com')
            ->setPassword('QOIzYaaab');

            $sub = utf8_encode($titulo);
            $from = utf8_encode($de);

            $mailer = Swift_Mailer::newInstance($transport);

            $message = Swift_Message::newInstance()
            ->setCharset('utf-8')

            //Give the message a subject
            ->setSubject($sub)
            //@todo cambiar los remitentes y destinatarios
            //Set the From address with an associative array
            ->setFrom(array('info@toyomotor.com.ve' => $from))

            //Set the To addresses with an associative array
            ->setTo(array($to))

            //Give it a body
            ->setBody($mensaje, 'text/html');
                
            //Si es diferente de null quiere decir que aun nadie la ha tomado se procede a enviar el email y guardar los cambios
            //Send the message
            //result tendra un entero si es 0 es que fallo
            $result = $mailer->send($message);
            
            if($result == 0){
                
                $this->getUser()->setFlash('notice', 'No se envio correctamente el email con el link de la encuesta al usuario debido a un problema.');
                $this->redirect('@enviarencuestaotro');
                                
            }else{
                                
                $this->getUser()->setFlash('notice', 'Se envio correctamente el email con el link de la encuesta al usuario.');
                $this->redirect('@enviarencuestaotro');
                
            }
            

    }  
    
    
    /**
     * Metodo que Realiza el envio del link para responder el cuestionario de satisfaccion
     * debera verificar si ya se puede enviar el cuestionario o no, esto quiere decir que solo
     * las publicaciones que tenga el estado amarillo podran enviarse y mostrarse.
     * Autor: Ing. Roberto Hernández De La Luz
     * @param sfWebRequest $request 
     */
    
    public function executeListEnvioencuesta(sfWebRequest $request){

        $cita = $this->getRoute()->getObject();

        if($cita->getEstadogeneral() != '1001'){
            
            $this->getUser()->setFlash('notice', 'La encuesta para esta cita ya fue enviada anteriormente ó Aun faltan otras etapas en el proceso de la cita.');
            $this->redirect('@cita');

        }else{
  
            /*Se realiza el envio del email*/

            $mensaje = 'Hola '.$cita->getUsuario()->getNombre().' '.$cita->getUsuario()->getApellido().', 
                esta recibiendo este email por que realizo un servicio a su auto con nosotros.<br/> <br/>
                La finalidad del presente correo es invitarlo a que conteste una encuesta de satisfaccion del cliente,
                la cual no llevara mas de 1 minuto y nos ayudara continuar mejorando nuestros servicios.<br/><br/>
                El link para poder contestar la encuesta se encuentra a continuacion:<br/><br/>
                <a href="http://www.toyomotor.com/citas/encuesta/a/s">Contestar Encuesta</a>
                <br/><br/>AUTOMOTRIZ TOYOMOTOR,C.A. RIF: J-29790037-3';

            
            $titulo = 'Encuesta de Servicio para: '.$cita->getVehiculoUsuario()->__toString();
            $de = 'ToyoMotor';
            $to = $cita->getUsuario()->getEmail();

            // send an email to the affiliate
            $transport = Swift_SmtpTransport::newInstance('ssl://smtp.gmail.com', 465)
            ->setUsername('toyomotorenvios@gmail.com')
            ->setPassword('QOIzYaaab');

            $sub = utf8_encode($titulo);
            $from = utf8_encode($de);

            $mailer = Swift_Mailer::newInstance($transport);

            $message = Swift_Message::newInstance()
            ->setCharset('utf-8')

            //Give the message a subject
            ->setSubject($sub)
            //@todo cambiar los remitentes y destinatarios
            //Set the From address with an associative array
            ->setFrom(array('info@toyomotor.com.ve' => $from))

            //Set the To addresses with an associative array
            ->setTo(array($to))

            //Give it a body
            ->setBody($mensaje, 'text/html');
                
            //Si es diferente de null quiere decir que aun nadie la ha tomado se procede a enviar el email y guardar los cambios
            //Send the message
            //result tendra un entero si es 0 es que fallo
            $result = $mailer->send($message);
            if($result == 0){
                
                $this->getUser()->setFlash('notice', 'No se envio correctamente el email con el link de la encuesta al usuario debido a un problema.');
                $this->redirect('@cita');
                                
            }else{
                //@todo revisar si cambiara la bandera cuando se envia el link o hasta que la encuesta es respondida
                $cita->setEncuesta(true);
                $cita->save();
                $cita->updateLuceneIndex();
                                
                $this->getUser()->setFlash('notice', 'Se envio correctamente el email con el link de la encuesta al usuario.');
                $this->redirect('@cita');
                
            }

        }


    }
    
    public function executeEnviomailcita(sfWebRequest $request){
        
       /*if(!$request->isMethod(sfRequest::POST)){
          
          $this->redirect('citaadmin/index');
          
        }*/
        
        $c = $request->getParameter('cita');
        $citaa = Doctrine_Core::getTable('Cita')->find(array($c['id_cita']));
        
        $this->hp = $citaa->getHoraPreferida();
        $this->ou = $citaa->getDetallesUsuario();
        
        $this->form = new CitaForm();
        $this->form->revisioncitaenvio($citaa->getFecha());
        
        $this->user = $citaa->getUsuario();
        $this->vehiculo = $citaa->getVehiculoUsuario();
        $this->servicios = $citaa->getServicios();
        
        /*Se envia al metodo que revisara si esta bien para salvarlo si no para detenerlo y mostrar el template de nuevo*/
        $this->Enviarmensaje($request, $this->form);
        
        $this->setTemplate('ListTomarc');
        
    }
    
    protected function Enviarmensaje(sfWebRequest $request, sfForm $form){
        
        $cita= $request->getParameter('cita');
        
        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
        
        //Si es valido enviara el email y guardara algunos cambios
        if ($form->isValid())
        {
                      
            /*Se genera un codigo aleatorio que serviara como identificador para confirmar o eliminar la cita*/
            $codigo = $this->creaID(mt_rand (100000000 , 999999999 ),false,9);
            
            /*Se recuperan los datos originales de la cita de la BD para compararlos con los que esta enviando el formulario*/
            $citao = Doctrine_Core::getTable('Cita')->find(array($cita['id_cita']));
            /*Se crea una copia que sera la que se ira modificando*/
            $citaf = Doctrine_Core::getTable('Cita')->find(array($cita['id_cita']));        
            
            /*Se comparan la fecha original y la del formulario para identificar si se cambio o no*/
            
            //Se reconstruye la fecha para compararla
            $f = $cita['fecha'];
            //@todo deberia quitarse esta variable
            $fechaform = $f['year'].'-'.$f['month'].'-'.$f['day'];
            
            $ff = $cita['fecha_entrega'];
            $fechaentrega = $ff['day'].'-'.$ff['month'].'-'.$ff['year'];
            
            //Si es igual significa que no cambio
           if(strtotime($f['month'].'/'.$f['day'].'/'.$f['year']) == strtotime($citao->getFecha())){
                $fecham = "<strong>Fecha Solcitada: </strong>".date('d-m-Y',  strtotime($citao->getFecha()));
           }else{
                $fecham = "<strong>Fecha Solcitada: </strong><strong>".$f['day'].'-'.$f['month'].'-'.$f['year'].'</strong> *La fecha solicitada fue cambiada por el asesor debido a la disponibilidad de la misma.'; 

                /*Se debio actualizar manualmente es decir hacer un update debiod a problemas con el metodo setFecha*/
                $query = Doctrine_Query::create()
                ->update('Cita c')
                ->set('c.fecha', '"'.date('Y-m-d',strtotime($f['month'].'/'.$f['day'].'/'.$f['year'])).'"')
                ->where('c.id_cita ="'.$cita['id_cita'].'"')
                ->execute();

            }
            
            if($cita['hora'] == $citao->getHora()){
                $horam ='<strong>Hora: </strong>'.$citao->getHora();
            }else{
                $horam ='<strong>Hora: </strong>'.$cita['hora'].' *La hora solicitada fue cambiada por el asesor.'; 
                
                /*Se debio actualizar manualmente es decir hacer un update debido a problemas con el metodo setHora*/
                $query = Doctrine_Query::create()
                ->update('Cita c')
                ->set('c.hora', '"'.$cita['hora'].'"')
                ->where('c.id_cita ="'.$cita['id_cita'].'"')
                ->execute();
            }
            
            /*Se realiza el envio del email*/
            
            /* Inicio de codigo agregado Ing. Roberto Hernández De La Luz Fecha: 22/08/11
            * Se cambio este codigo desde Cita.class.php para aca para poder enviar correctamente el correo electronico
            * ya que se estaba originalmente enviando el correo con servicios antes de guardar la cita y por ende los servicios
            */
            
            /*Codigo agregado Ing. Roberto Hernández De La Luz se debe ahora verificar si se tienen servicios o no para entonces enviar el mensaje final de manera correcta*/

            $servicios = '';
            $servire=$citao->getServicios();
            if($servire[0]->getNombre() == null || $servire[0]->getNombre() == ''){
                
                $servicios = "No se selecciono nigun servicio recomendado. <br/>";
                
            }else{
                
                $servicios = "";
                foreach ($citao->getServicios() as $servicio) :
                    $servicios .= $servicio->getNombre().'<br/>';
                endforeach;
                
            }
              
            $mensaje = 'Hola '.$citao->getUsuario()->getNombre().' '.$citao->getUsuario()->getApellido().'<br/> <br/>
                Este email contiene informacion relacionada a la solicitud de servicio que realizo a travez de nuestra pagina web en AUTOMOTRIZ TOYOMOTOR,C.A., los datos son los siguientes:<br/><br/>
                <strong>Veh&iacute;culo: </strong>'.$citao->getVehiculoUsuario()->__toString().'.<br/><br/>
                <strong>Kilometraje: </strong>'.$citao->getKilometraje().'<br/><br/>'
                .$fecham.'<br/><br/>'
                .$horam.'<br/><br/>
                <strong>Servicios Solicitados: </strong><br/><br/>'.$servicios.'<br>
                <strong>Observaci&oacute;n:: </strong>'.$citao->getDetallesUsuario().'<br/> <br/>
                '.$cita['observacion'].'<br/><br/>    
                Si desea aceptar la cita de clic en <strong>Aceptar Cita</strong> si no esta de acuerdo con la cita, de clic en <strong>NO Aceptar Cita</strong> y esta sera eliminada, recuerde que tendra que solicitar una nueva fecha
                para que el sistema pueda tenerlo en cuenta<br/><br/><a href="http://www.toyomotor.com/citas/confirmacion/r/s/c/'.$codigo.'">Aceptar Cita</a> --- <a href="http://www.toyomotor.com/citas/confirmacion/r/n/c/'.$codigo.'">NO Aceptar Cita</a>
                <br/><br/>AUTOMOTRIZ TOYOMOTOR,C.A. RIF: J-29790037-3';
//@todo revisar las direcciones finales
                       
            //<a href="http://localhost:9094/citas/confirmacion/r/s/c/'.$codigo.'">Aceptar Cita</a> --- <a href="http://localhost:9094/citas/confirmacion/r/n/c/'.$codigo.'">NO Aceptar Cita</a>
            
            $titulo = 'Confirmacion de Cita '.$citao->getVehiculoUsuario()->__toString();
            $de = 'Automotriz TOYOMOTOR';
            //$to = 'rhernandez@netosfera.com'; //@todo cambiar por el email del usuario que esta pidiendo la cita
            $to = $citao->getUsuario()->getEmail();

            // send an email to the affiliate
            $transport = Swift_SmtpTransport::newInstance('ssl://smtp.gmail.com', 465)
            ->setUsername('toyomotorenvios@gmail.com')
            ->setPassword('QOIzYaaab');

            $sub = utf8_encode($titulo);
            $from = utf8_encode($de);

            $mailer = Swift_Mailer::newInstance($transport);

            $message = Swift_Message::newInstance()
            ->setCharset('utf-8')

            //Give the message a subject
            ->setSubject($sub)
            //@todo cambiar los remitentes y destinatarios
            //Set the From address with an associative array
            ->setFrom(array('info@toyomotor.com.ve' => $from))

            //Set the To addresses with an associative array
            ->setTo(array($to))

            //Give it a body
            ->setBody($mensaje, 'text/html');

            //Se hace una ultima consulta a la cita para ver su estado actual
            $citaverificacionfinal = Doctrine_Core::getTable('Cita')->find(array($cita['id_cita']));
            if($citaverificacionfinal->getIdVendedor() == null ){
                
                //Si es diferente de null quiere decir que aun nadie la ha tomado se procede a enviar el email y guardar los cambios
                //Send the message
                //result tendra un entero si es 0 es que fallo
                $result = $mailer->send($message);
                
                //Si el envio fue correcto se cambiaran los estados y se guardaran las modificaciones
                
                $citaf->setHoraEntrega($cita['hora_entrega']);
                
                
                /*Se debio actualizar manualmente es decir hacer un update debido a problemas con el metodo setFechaEntrega()*/
                $query1 = Doctrine_Query::create()
                ->update('Cita cc')
                ->set('cc.fecha_entrega', '"'.date('Y-m-d',strtotime($ff['month'].'/'.$ff['day'].'/'.$ff['year'])).'"')
                ->where('cc.id_cita ="'.$cita['id_cita'].'"')
                ->execute();
                
                
                $citaf->setIdVendedor($this->getUser()->getAttribute('id_usuario'));
                $citaf->setIsAceptado(False);
                $citaf->setIsPending(True);
                $citaf->setEncuesta(False);
                $citaf->setClaveSeguridad($codigo);
                $citaf->save();
                $citaf->updateLuceneIndex();
                
                $this->getUser()->setFlash('notice', 'El email se ha enviado correctamente al cliente recuerde revisar las citas que si han aceptado.');
                $this->redirect('citaadmin/index'); 
                
            }else{
                
                $this->getUser()->setFlash('notice', 'No se ha enviando el email debido a que esta cita ya tiene un vendedor asignado.');
                $this->redirect('citaadmin/index'); 
                
            }


        }
    }
    
    public function executeBuscar(sfWebRequest $request){
        
        $this->forwardUnless($query = $request->getParameter('query'), 'cita', 'index');
        
        $this->citas = Doctrine_Core::getTable('Cita') ->getForLuceneQuery($query);
        
    }
    
        /**
         * Translates a number to a short alhanumeric version
         *
         * Translated any number up to 9007199254740992
         * to a shorter version in letters e.g.:
         * 9007199254740989 --> PpQXn7COf
         *
         * specifiying the second argument true, it will
         * translate back e.g.:
         * PpQXn7COf --> 9007199254740989
         *
         * this function is based on any2dec && dec2any by
         * fragmer[at]mail[dot]ru
         * see: http://nl3.php.net/manual/en/function.base-convert.php#52450
         *
         * If you want the alphaID to be at least 3 letter long, use the
         * $pad_up = 3 argument
         *
         * In most cases this is better than totally random ID generators
         * because this can easily avoid duplicate ID's.
         * For example if you correlate the alpha ID to an auto incrementing ID
         * in your database, you're done.
         *
         * The reverse is done because it makes it slightly more cryptic,
         * but it also makes it easier to spread lots of IDs in different
         * directories on your filesystem. Example:
         * $part1 = substr($alpha_id,0,1);
         * $part2 = substr($alpha_id,1,1);
         * $part3 = substr($alpha_id,2,strlen($alpha_id));
         * $destindir = "/".$part1."/".$part2."/".$part3;
         * // by reversing, directories are more evenly spread out. The
         * // first 26 directories already occupy 26 main levels
         *
         * more info on limitation:
         * - http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/165372
         *
         * if you really need this for bigger numbers you probably have to look
         * at things like: http://theserverpages.com/php/manual/en/ref.bc.php
         * or: http://theserverpages.com/php/manual/en/ref.gmp.php
         * but I haven't really dugg into this. If you have more info on those
         * matters feel free to leave a comment.
         *
         * @author  Kevin van Zonneveld <kevin@vanzonneveld.net>
         * @author  Simon Franz
         * @author  Deadfish
         * @copyright 2008 Kevin van Zonneveld (http://kevin.vanzonneveld.net)
         * @license   http://www.opensource.org/licenses/bsd-license.php New BSD Licence
         * @version   SVN: Release: $Id: alphaID.inc.php 344 2009-06-10 17:43:59Z kevin $
         * @link    http://kevin.vanzonneveld.net/
         *
         * @param mixed   $in    String or long input to translate
         * @param boolean $to_num  Reverses translation when true
         * @param mixed   $pad_up  Number or boolean padds the result up to a specified length
         * @param string  $passKey Supplying a password makes it harder to calculate the original ID
         * 
         * @return mixed string or long
         */
        protected function creaID($in, $to_num = false, $pad_up = false, $passKey = null)
        {
          $index = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
          if ($passKey !== null) {
            // Although this function's purpose is to just make the
            // ID short - and not so much secure,
            // with this patch by Simon Franz (http://blog.snaky.org/)
            // you can optionally supply a password to make it harder
            // to calculate the corresponding numeric ID

            for ($n = 0; $n<strlen($index); $n++) {
              $i[] = substr( $index,$n ,1);
            }

            $passhash = hash('sha256',$passKey);
            $passhash = (strlen($passhash) < strlen($index))
              ? hash('sha512',$passKey)
              : $passhash;

            for ($n=0; $n < strlen($index); $n++) {
              $p[] =  substr($passhash, $n ,1);
            }

            array_multisort($p,  SORT_DESC, $i);
            $index = implode($i);
          }

          $base  = strlen($index);

          if ($to_num) {
            // Digital number  <<--  alphabet letter code
            $in  = strrev($in);
            $out = 0;
            $len = strlen($in) - 1;
            for ($t = 0; $t <= $len; $t++) {
              $bcpow = bcpow($base, $len - $t);
              $out   = $out + strpos($index, substr($in, $t, 1)) * $bcpow;
            }

            if (is_numeric($pad_up)) {
              $pad_up--;
              if ($pad_up > 0) {
                $out -= pow($base, $pad_up);
              }
            }
            $out = sprintf('%F', $out);
            $out = substr($out, 0, strpos($out, '.'));
          } else {
            // Digital number  -->>  alphabet letter code
            if (is_numeric($pad_up)) {
              $pad_up--;
              if ($pad_up > 0) {
                $in += pow($base, $pad_up);
              }
            }

            $out = "";
            for ($t = floor(log($in, $base)); $t >= 0; $t--) {
              $bcp = bcpow($base, $t);
              $a   = floor($in / $bcp) % $base;
              $out = $out . substr($index, $a, 1);
              $in  = $in - ($a * $bcp);
            }
            $out = strrev($out); // reverse
          }

          return $out;
        }
        
        /*Se sobreescribe el metodo para editar la publicaicon
         * para que no sea editable y solo muestre la informacion estatica
         * Autor: Ing. Roberto Hernández De La Luz
         */
  public function executeEdit(sfWebRequest $request)
  {
    $this->cita = $this->getRoute()->getObject();
    $this->form = $this->configuration->getForm($this->cita);
    //$this->form->revision();
  }
    
}
